use crate::hot100::base::{ListNode, Vec2ListNode};

#[test]
fn test_remove_nth_from_end() {
    let node = ListNode::new(-1);
    assert_eq!(
        remove_nth_from_end(node.from_vec(vec![1, 2, 3, 4, 5]), 2),
        node.from_vec(vec![1, 2, 3, 5])
    );

    assert_eq!(
        remove_nth_from_end(node.from_vec(vec![1]), 1),
        node.from_vec(vec![])
    );

    assert_eq!(
        remove_nth_from_end(node.from_vec(vec![1, 2]), 1),
        node.from_vec(vec![1])
    );
}

/*
   19. 删除链表的倒数第 N 个结点
   给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。

   进阶：你能尝试使用一趟扫描实现吗？

   示例 1：
   输入：head = [1,2,3,4,5], n = 2
   输出：[1,2,3,5]

   示例 2：
   输入：head = [1], n = 1
   输出：[]

   示例 3：
   输入：head = [1,2], n = 1
   输出：[1]

   提示：
   链表中结点的数目为 sz
   1 <= sz <= 30
   0 <= Node.val <= 100
   1 <= n <= sz
*/
pub fn remove_nth_from_end(head: Option<Box<ListNode>>, n: i32) -> Option<Box<ListNode>> {
    let (mut fast, mut slow) = (&head, &head);
    let mut root = ListNode::new(0);
    let mut curr = &mut root;

    for _i in 0..n {
        fast = &fast.as_ref()?.next;
    }

    while let (Some(f), Some(s)) = (fast.as_ref(), slow.as_ref()) {
        curr.next = Some(Box::new(ListNode::new(s.val)));
        curr = curr.next.as_mut()?;
        
        fast = &f.next;
        slow = &s.next;
    }

    curr.next = slow.as_ref()?.next.clone();

    root.next
}
